// ! 重要(精通)
// todo primose是es6新增的用于解决异步的方法，主要解决的是回调函数的回调地狱问题
// todo primose有三种状态，pending(进行中), fulfilled（已成功）和rejected（已失败）,pending -> fulfilled或者pending -> rejected, 状态是不可逆
// todo 三个原型 方法(then,catch,finally)和7个静态方法(all, race, allSettled, any, resolve, reject, try)

// 创建promise
const done = true;
const p1 = new Promise((resolve, reject) => {
  setTimeout(() => {
    if (done) {
      resolve("ok");
    } else {
      reject("不ok");
    }
  }, 2000);
});
const p2 = new Promise((resolve, reject) => {
  if (!done) {
    resolve("好");
  } else {
    reject("不好");
  }
});

// 消费promise
// p1.then((res) => {
//   console.log(res);
//   return "ok2";
// })
//   .then((res2) => {
//     console.log(a);
//   })
//   .catch((err) => {
//     console.log("err");
//     console.log(err);
//   })
//   .finally(() => {
//     console.log(123);
//   });

// todo all方法
// todo 接收一个promise对象组成的数组作为参数并且返回一个promise对象，如果每个对象都成功，会一起返回它们成功的结果组成的数组(顺序不变)，如果其中一个失败了，就返回最先失败的那个结果
// Promise.all([p1, p2])
//   .then((res) => {
//     console.log(res);
//   })
//   .catch((err) => {
//     console.log(err);
//   });

// todo race方法
// todo 接收一个promise对象组成的数组作为参数并且返回一个promise对象，返回的是最先改变状态的那个结果(不管成功还是失败)

Promise.race([p1, p2])
  .then((res) => {
    console.log("res:" + res);
  })
  .catch((err) => {
    console.log("err:" + err);
  });

// ! 剩下的方法是熟悉
